home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
cat
/
watchdog.i
< prev
next >
Wrap
Text File
|
1997-10-26
|
16KB
|
558 lines
IMPLEMENTATION MODULE WatchDog;
(*==============================================================*
* Modul: WatchDog Implementation *
* Autor: Johannes Gttker-Schnetmann, Dirk Steins*
* erstellt am: April 1192 *
* letzte nderung am: 06.04.1992 *
* Version: 0.1 *
* Interne Version: V#0003 *
*==============================================================*
* Interner Laberfilter fr CAT. Entstanden aus dem Watchdog- *
* Accessory. Benutzt neben WatchDog.DAT noch Konfigurations- *
* variablen, um festzustellen, welche Antwort CAT gegeben *
* werden soll. *
* *
*==============================================================*)
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM StrConv IMPORT CardToStr;
IMPORT MagicAES, mtUtils;
IMPORT Strings;
IMPORT Lists;
IMPORT mtTextfiles;
CONST
cr = 15C; lf = 12C; space = 40C;
(* Anzahl der zu testenden Namen -1 *)
maxNames = 10;
enableWatchDog = 0;
disableWatchDog = 1;
CatAffirm = 2;
CatAsk = 3;
CatAccept = 4;
CatForget = 5;
CatGreetings = 6;
(* Solche Infos verschickt Cat: *)
TYPE strPtr = POINTER TO ARRAY[0..20000] OF CHAR;
smallPtr = POINTER TO ARRAY[0..255] OF CHAR;
MsgPtr = POINTER TO RECORD
PtrGruppe,
PtrName,
PtrBetreff : smallPtr;
PtrText : strPtr;
TextLength : CARDINAL
END;
VAR
(* die allgemeinen Vars.. *)
applId, menuId,
events, return : INTEGER;
(* etwas aufwenigere Deklaration, wg. einfachem Zugriff *)
Mess : RECORD
MessType : CARDINAL;
rest : ARRAY[1..7] OF CARDINAL
END;
Look : POINTER TO RECORD
messId : INTEGER;
apId : INTEGER;
over : INTEGER;
(* AccId, AccAcc *)
version, protoStep : CHAR;
name : ADDRESS;
menuId : INTEGER;
accId : INTEGER;
END;
lm : POINTER TO RECORD
messId : CARDINAL;
apId : INTEGER;
over : INTEGER;
catType: INTEGER;
msg : MsgPtr;
isOn : INTEGER
END;
(* der eigene Name, zum Senden fr XACC *)
OurName : ARRAY[0..15] OF CHAR;
(* Hat sich Cat schon gemeldet? *)
catActive : BOOLEAN;
watchDogActive : BOOLEAN; (* Watchdog eingeschaltet? *)
(* Array fr die Namen, die erlaubt sind.. *)
TYPE filtType = (name, stich, text);
filterSet = SET OF filtType;
filtEntry = RECORD
filter : filterSet;
name : smallPtr;
stichw : smallPtr;
ftext : smallPtr;
gruppe : ARRAY [0..10] OF CHAR;
nameO,
stichO,
ftextO,
gruppeO : BOOLEAN;
filtCount: CARDINAL;
END;
ptrFiltEntry = POINTER TO filtEntry;
VAR
filtList : Lists.List;
voidO : BOOLEAN;
lastGruppe : ARRAY [0..10] OF CHAR;
lastGrO : BOOLEAN;
globFiltCount,
messCount : CARDINAL;
(*
PROCEDURE dumpFiltList();
VAR e : ptrFiltEntry;
BEGIN
Lists.ResetList (filtList);
e := Lists.NextEntry (filtList);
WHILE e # NIL DO
WriteString ('Gruppe: ');
WriteString (e^.gruppe);
IF e^.gruppeO THEN WriteString (' wird global gefiltert')
ELSE
WriteString (' wird nicht global gefiltert');
END;
WriteLn;
IF name IN e^.filter
THEN
WriteString ('Name: ');
WriteString (e^.name^);
IF ~e^.nameO THEN WriteString (' wird gefiltert.'); ELSE
WriteString (' wird nicht gefiltert');
END;
WriteLn;
END;
IF stich IN e^.filter
THEN
WriteString ('Betreff: ');
WriteString (e^.stichw^);
IF ~e^.stichO THEN WriteString (' wird gefiltert.'); ELSE
WriteString (' wird nicht gefiltert');
END;
WriteLn;
END;
IF text IN e^.filter
THEN
WriteString ('Text: ');
WriteString (e^.ftext^);
IF ~e^.ftextO THEN WriteString (' wird gefiltert.'); ELSE
WriteString (' wird nicht gefiltert');
END;
WriteLn;
END;
e := Lists.NextEntry (filtList);
END;
END dumpFiltList;
*)
PROCEDURE parseline (REF s : ARRAY OF CHAR);
(* Folgende Tokens sind mglich:
* NAME=<filtname>;{ON|OFF}; Nachrichten von diesem Absender werden immer
* gefiltert bzw. durchgelassen.
* GRUPPE=<filtGruppe>;{ON|OFF} Die Filtergruppe wird auf die Gruppe gesetzt.
* BETREFF=<stichwort>;{ON|OFF}; Wenn das Wort im Betreff vorkommt, wird gefiltert.
* TEXT=<text>;{ON|OFF}; Wenn der text enthalten ist, wird gefiltert.
*
* Die Schalter ON|OFF entscheiden darber, ob der filterbetreff immer akzeptiert wird,
* oder ob der Filterbetreff immer verworfen wird.
* Sollte einmal beides zutreffen, so wird nur dann gefiltert, wenn beide Bedingungen
* erfllt sind.
*)
VAR p, lastp : INTEGER;
entry : filtEntry;
str : ARRAY [0..255] OF CHAR;
token : ARRAY [0..40] OF CHAR;
ptrEntry : ptrFiltEntry;
onoff : ARRAY [0..20] OF CHAR;
BEGIN
p := 0;
lastp := 0;
WHILE p >= 0 DO
p := Strings.Pos ('=',s,p);
(* entry lschen *)
WITH entry DO
filter := filterSet{};
name := NIL;
stichw := NIL;
ftext := NIL;
gruppe := '';
END;
(* Token holen *)
Strings.Copy (s,lastp,p-lastp,token,voidO);
IF Strings.StrEqual (token, "NAME")
THEN
INCL(entry.filter, name);
(* Namen holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp, p-lastp, str, voidO);
ALLOCATE (entry.name, Strings.Length(str)+1);
IF entry.name # NIL
THEN
Strings.Assign (str, entry.name^, voidO);
END;
(* Schalter holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp,p-lastp, str, voidO);
lastp := p+1;
IF Strings.StrEqual (str, 'ON')
THEN
entry.nameO := TRUE
ELSIF Strings.StrEqual (str, 'OFF')
THEN
entry.nameO := FALSE;
ELSE
EXCL (entry.filter, name);
END;
ELSE
EXCL (entry.filter, name);
END;
ELSE
EXCL (entry.filter, name);
END;
END;
(* Stichwort? *)
IF Strings.StrEqual (token, "BETREFF")
THEN
INCL(entry.filter, stich);
(* Betreff holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp, p-lastp, str, voidO);
ALLOCATE (entry.stichw, Strings.Length(str)+1);
IF entry.stichw # NIL
THEN
Strings.Assign (str, entry.stichw^, voidO);
END;
(* Schalter holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp,p-lastp, str, voidO);
lastp := p+1;
IF Strings.StrEqual (str, 'ON')
THEN
entry.stichO := TRUE
ELSIF Strings.StrEqual (str, 'OFF')
THEN
entry.stichO := FALSE;
ELSE
EXCL (entry.filter, stich);
END;
ELSE
EXCL (entry.filter, stich);
END;
ELSE
EXCL (entry.filter, stich);
END;
END;
(* Vorerst nicht, da ich nicht den gesamten Text in Upcase wandeln will
*
(* Irgendein Text *)
IF Strings.StrEqual (token, "TEXT")
THEN
INCL(entry.filter, text);
(* ftextn holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp, p-lastp, str, voidO);
ALLOCATE (entry.ftext, Strings.Length(str)+1);
IF entry.ftext # NIL
THEN
Strings.Assign (str, entry.ftext^, voidO);
END;
(* Schalter holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp,p-lastp, str, voidO);
lastp := p+1;
IF Strings.StrEqual (str, 'ON')
THEN
entry.ftextO := TRUE
ELSIF Strings.StrEqual (str, 'OFF')
THEN
entry.ftextO := FALSE;
ELSE
EXCL (entry.filter, text);
END;
ELSE
EXCL (entry.filter, text);
END;
ELSE
EXCL (entry.filter, text);
END;
END;
*)
(* Gruppenname? *)
IF Strings.StrEqual (token, "GRUPPE")
THEN
(* ftextn holen *)
lastp := p+1;
p := Strings.Pos (';',s,lastp);
IF p>= 0 THEN
Strings.Copy (s, lastp, p-lastp, str, voidO);
lastp := p+1;
p := Strings.Pos (';',s, lastp);
IF p >= 0 THEN
Strings.Copy (s, lastp, p-lastp, onoff, voidO);
lastp := p+1;
IF Strings.StrEqual (onoff,'ON')
THEN
IF (Strings.Length(str) > 0) & (Strings.Length (str) <=10)
THEN
Strings.Assign (str, lastGruppe, voidO);
lastGrO := TRUE
END;
ELSIF Strings.StrEqual (onoff, 'OFF')
THEN
IF (Strings.Length(str) > 0) & (Strings.Length (str) <=10)
THEN
Strings.Assign (str, lastGruppe, voidO);
lastGrO := FALSE
END;
END;
END;
END;
END;
IF ~Strings.Empty (lastGruppe) & (entry.filter # filterSet{})
THEN
NEW (ptrEntry);
IF ptrEntry # NIL
THEN
ptrEntry^ := entry;
ptrEntry^.filtCount := 0;
Strings.Assign (lastGruppe,ptrEntry^.gruppe, voidO);
ptrEntry^.gruppeO := lastGrO;
Lists.AppendEntry (filtList, ptrEntry, voidO);
END;
END;
END;
END parseline;
PROCEDURE getFiltList();
CONST filtFile = 'watchdog.dat';
VAR filtName : ARRAY [0..127] OF CHAR;
ft : mtTextfiles.TEXTFILE;
s : ARRAY [0..255] OF CHAR;
BEGIN
Lists.CreateList (filtList, voidO);
Strings.Assign (filtFile, filtName, voidO);
MagicAES.ShelFind (filtName);
IF mtTextfiles.OpenTextfile (filtName, mtTextfiles.READ, 8192, ft)
THEN
WHILE ~mtTextfiles.EndofText(ft) DO
mtTextfiles.ReadLine (ft, s);
mtTextfiles.ReadLn (ft);
Strings.Upper (s);
parseline (s);
END;
mtTextfiles.CloseTextfile (ft);
END;
END getFiltList;
PROCEDURE SendID(Dest : CARDINAL);
BEGIN
WITH Look^ DO
messId := AccId;
apId := applId;
over := 0;
version := 0C;
protoStep := 0C;
name := ADR(OurName);
menuId := menuId;
accId := 0;
END;
MagicAES.ApplWrite(Dest, 16, Look^);
END SendID;
(*
PROCEDURE WriteString (REF s : ARRAY OF CHAR);
BEGIN
MagicDOS.Cconws (s);
END WriteString;
PROCEDURE WriteLn();
BEGIN
MagicDOS.Cconout (12C);
MagicDOS.Cconout (15C);
END WriteLn;
*)
PROCEDURE IsBad(REF msg : data.PtrRecord):BOOLEAN;
(*
* Entscheidung, ob eine Msg durch darf, oder nicht.
*
*)
VAR
gr : ARRAY [0..20] OF CHAR;
abs : ARRAY [0..100] OF CHAR;
weg : ARRAY [0..40] OF CHAR;
VAR b : BOOLEAN;
z : CARDINAL;
e : ptrFiltEntry;
found,
accept : BOOLEAN;
grAccept : BOOLEAN;
BEGIN
(*
* -> die ersten drei kommen mit ihrem Prfix-Buchstaben,
* mute ich eben feststellen..
*
*
InOut.WriteLn;
InOut.WriteString(lm^.msg^.PtrGruppe^);
InOut.WriteLn;
InOut.WriteString(lm^.msg^.PtrName^);
InOut.WriteLn;
InOut.WriteString(lm^.msg^.PtrBetreff^);
TYPE PtrRecord =
RECORD
pGruppe, pVon, (* Absender, Gruppe *)
pWegen : Str255Ptr; (* Betreff, *)
pText : BigTextPtr; (* MsgText *)
TextMax : CARDINAL;
pId, (* Maus-ID der Mitteilung *)
pRefNr, pAn, (* kommentierte Msg, Empfnger *)
pEZeit, pBSZeit, (* Eingabezeit, Bearb.status+Zeit *)
pMId, pRId, (* MessageID, RId gem. Def *)
pBox, (* Box gem. Def. *)
pName : Str255Ptr; (* Name gem. Def falls # Absenderangabe *)
txt : mtTextfiles.TEXTFILE;
whatsThere : BITSET;
END;
*)
(* G vor Gruppennamen entfernen *)
IF msg.pGruppe # NIL
THEN
Strings.Copy (msg^.PtrGruppe^, 1,
Strings.Length(lm^.msg^.PtrGruppe^)-1, gr, voidO);
END;
IF msg.pVon # NIL
THEN
Strings.Assign (msg.pVon^,abs, voidO);
ELSE
abs := '';
END;
IF msg.pWegen # NIL
THEN
Strings.Assign (msg.pWegen^,weg, voidO);
ELSE
weg := '';
END;
Strings.Upper (gr);
Strings.Upper (abs);
Strings.Upper (weg);
grAccept := FALSE;
Lists.ResetList (filtList);
e := Lists.NextEntry (filtList);
accept := FALSE;
found := FALSE;
WHILE e # NIL DO
IF Strings.StrEqual (e^.gruppe, gr) THEN
grAccept := e^.gruppeO;
(* Ja, der Eintrag geht ber diese Gruppe *)
IF name IN e^.filter
THEN
IF Strings.Pos (e^.name^, abs, 0) >= 0 THEN
(* Bedingung trifft zu *)
accept := accept OR e^.nameO;
found := TRUE;
END;
END;
IF stich IN e^.filter
THEN
IF Strings.Pos (e^.stichw^, weg,0) >= 0 THEN
(* Bedingung trifft zu *)
accept := accept OR e^.stichO;
found := TRUE;
END;
END;
(*
IF text IN e^.filter
THEN
IF Strings.Pos (e^.ftext^, msg.pText^,0) >= 0 THEN
(* Bedingung trifft zu *)
accept := accept OR e^.ftextO;
found := TRUE;
END;
END;
*)
IF found THEN
IF accept THEN
INC (e^.filtCount);
INC (globFiltCount);
END;
RETURN accept
END;
END;
e := Lists.NextEntry (filtList);
END;
RETURN grAccept;
END IsBad;
PROCEDURE SendMess(msg : CARDINAL; i1 : INTEGER; l : LONGCARD; i2, i3 : INTEGER);
(*
* AES-Msg an die Hauptapplikation schicken
*
*)
VAR mess : RECORD
me: CARDINAL;
m : ARRAY[1..3] OF INTEGER;
l : LONGCARD;
n : ARRAY[6..7] OF INTEGER;
END;
BEGIN
mess.me := msg;
mess.m[1] := applId;
mess.m[2] := 0;
mess.m[3] := i1;
mess.l := l;
mess.n[6] := i2;
mess.n[7] := i3;
MagicAES.ApplWrite(0, 16, mess);
END SendMess;
PROCEDURE CheckThis();
(*
* Test einer Msg mit Antwort an Cat
*
*)
BEGIN
INC (messCount);
IF watchDogActive & IsBad() THEN
SendMess(HelloWatchDog, CatForget, 0, 0,0);
ELSE
SendMess(HelloWatchDog, CatAccept, 0, 0,0);
END;
END CheckThis;
END WatchDog.